package cn.doit.utils

import org.apache.commons.pool2.impl.GenericObjectPoolConfig
import org.slf4j.LoggerFactory
import redis.clients.jedis.{Jedis, JedisPool}
import redis.clients.jedis.exceptions.JedisException


object JedisUtils extends Serializable {
  val logger = LoggerFactory.getLogger("JedisUtils")

  /*def main(args: Array[String]): Unit = {

    val jd: Jedis = getJedis()
    println("jedis....................." +  jd.dbSize())

  }*/

  val redisHost  = ConfigUtils.redis_host
  val redisPort =  ConfigUtils.redis_port
  val redisTimeout = 30000
  /*
  在 Spark 集群环境部署 Application 后，在进行计算的时候会将作用于 RDD 数据集上的
  函数（Functions）发送到集群中 Worker 上的 Executor 上（在 Spark Streaming 中是
  作用于 DStream 的操作），那么这些函数操作所作用的对象（Elements）必须是可序列
  化的，通过 Scala 也可以使用 lazy 引用来解决，否则这些对象（Elements）在跨节点序
  列化传输后，无法正确地执行反序列化重构成实际可用的对象。
   */
//  lazy val config = new JedisPoolConfig()
   lazy val config = new GenericObjectPoolConfig()

  //控制一个pool可分配多少个jedis实例，通过pool.getResource()来获取
  //如果赋值为-1，则表示不限制 如果pool已经分配了maxActive个jedis实例，则此时pool的状态为exhausted(耗尽)。
  config.setMaxTotal(8000)
  //控制一个pool最多有多少个状态为idle(空闲的)的jedis实例。
  config.setMaxIdle(1000)
  //表示当borrow(引入)一个jedis实例时，最大的等待时间，如果超过等待时间，则直接抛出JedisConnectionException
  config.setMaxWaitMillis(1000 * 100)
  //在borrow一个jedis实例时，是否提前进行validate操作 如果为true，则得到的jedis实例均是可用的
  config.setTestOnBorrow(true)

  val pool = new JedisPool(config, redisHost, redisPort, redisTimeout)


//  lazy val pool = new JedisPool(new GenericObjectPoolConfig(), redisHost, redisPort, redisTimeout)

  /**
    * 获得redis连接
    *
    * @return Jedis
    */
  def getJedis(): Jedis = {

    if (pool != null) {
      val resource: Jedis = pool.getResource()
      logger.info("获取redis。。。。。。"+resource)
      resource.select(1)
      resource
    } else {
      logger.error("error!!!!!!!!!!!!!!-----------JedisPool is null")
      throw new NullPointerException("JedisPool is null")
    }
  }



  /**
    * 关闭连接池
    */
  def shutdown() {
    if (pool != null) {
      try {
        pool.destroy()
      } catch {
        case e: JedisException => logger.error("destory RedisPool failed")
      }
    }
  }

  //sys.addShutdownHook(hook.run)
}
